"""
题目：给定一个图和两个顶点v1、v2，判断图中是否存在从v1到v2的边（有向图需严格匹配方向，无向图则双向均视为存在）。
"""

class Graph:
    def __init__(self, is_directed=False):
        self.vertices = {}
        self.is_directed = is_directed

    def add_vertex(self, vertex):
        if vertex not in self.vertices:
            self.vertices[vertex] = []

    def add_edge(self, v1, v2):
        self.add_vertex(v1)
        self.add_vertex(v2)
        self.vertices[v1].append(v2)
        if not self.is_directed:
            self.vertices[v2].append(v1)

    def has_edge(self, v1, v2):
        """检查是否存在从v1到v2的边"""
        # 先判断两个顶点是否存在
        if v1 not in self.vertices or v2 not in self.vertices:
            return False
        # 检查v2是否在v1的邻接列表中
        return v2 in self.vertices[v1]

# 测试
if __name__ == "__main__":
    # 测试无向图
    undir_graph = Graph()
    undir_graph.add_edge('X', 'Y')
    undir_graph.add_edge('Y', 'Z')
    print(undir_graph.has_edge('X', 'Y'))  # 输出: True（无向图双向有效）
    print(undir_graph.has_edge('Y', 'X'))  # 输出: True
    print(undir_graph.has_edge('X', 'Z'))  # 输出: False

    # 测试有向图
    dir_graph = Graph(is_directed=True)
    dir_graph.add_edge('A', 'B')
    dir_graph.add_edge('B', 'C')
    print(dir_graph.has_edge('A', 'B'))  # 输出: True（方向匹配）
    print(dir_graph.has_edge('B', 'A'))  # 输出: False（方向不匹配）